#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

#define FILE_NAME "log.txt"

//stderr
//int main()
//{
//    // ./myfile > log.txt 2>&1    将1的内容放入2   ，再次重定向
//    // ./myfile 1 > log.txt                        ./myfile 1 > log.txt 2 > &1     ,1重定向log.txt  2重定向1
//    // .myfile 1 > log.txt  2 > log.txt.err   1重定向log.txt  2重定向log.txt.err
//    fprintf(stdout,"hello stdout\n");
//    fprintf(stderr,"hello stderr\n");
//
//    
//    perror("...\n");//向正常输出中打印
//    printf("...\n");//向错误输出中打印，方便重定向直接分开
//
//    return 0;
//}



//重定向
int main()
{
    //int fd = open(FILE_NAME,O_CREAT | O_WRONLY |O_APPEND,0666);//追加方式
    int fd = open(FILE_NAME,O_RDONLY);//输入方式
    if(fd<0)
    {
        perror("open");
        return 1;
    }

    //dup2(fd,1);//输出重定向，会取消fd对log.txt的指向，引用计数-1，fd 1 指向log.txt;
    //printf("fd :%d\n",fd); //fd还是原来的fd = 3 ，不过已经被OS关闭,原来的stdout被关闭，因为引用计数为0
    //printf("hello printf\n");
    //fprintf(stdout,"hello fprintf\n");
   
    dup2(fd,0);//输入重定向
    char buffer[1024];
    fread(buffer,1,1024,stdin);
    printf("%s",buffer);
    close(fd);
    return 0;
}




//int main()
//{
//    ////从fd对应文件缓冲区读取数据,返回值是读到的有效字节数
//    //char buffer[1024];
//    //ssize_t s = read(0,buffer,1024);//从stdin中，读入到buffer中（包括'\n'），希望读1024个字节
//    //if(s>0)
//    //{
//    //    buffer[s-1] = 0;//最后'\n'改为'\0'
//    //    //printf("echo# %s\n",buffer);
//    //    
//    //    //write返回实际写入的字节数
//    //    write(1,buffer,strlen(buffer));
//    //}
//
//    
//    //close(1);//关闭stdin
//    close(0);
//
//    //int fd = open(FILE_NAME,O_CREAT | O_WRONLY | O_TRUNC,0666);//追加重定向
//    //int fd = open(FILE_NAME,O_CREAT | O_WRONLY | O_APPEND,0666);//追加重定向
//    int fd = open(FILE_NAME,O_RDONLY);//只读方式打开
//    if(fd<0)
//    {
//        perror("open");
//        return 1;
//    }
//    char buffer[1024];
//    fread(buffer,1,sizeof(buffer),stdin);//从stdin->fd = 0 log.txt中读入到buffer中，输入重定向,上层fd不变，底层fd指向的内容改变
//    printf("%s\n",buffer);
//
//
//    //printf("fd = %d\n",fd);
//    //printf("stdout->fd = %d\n",stdout->_fileno);//printf只认文件描述符1,1指向什么就向什么打印
//    //重定向的本质，其实就是修改特性文件fd的下标指向的内容
//    
//    //stdout默认是1
//    //fprintf(stdout, "fd = %d\n",fd);
//    //fprintf(stdout, "stdout->fd = %d\n",stdout->_fileno);//printf只认文件描述符1,1指向什么就向什么打印
//
//    //语言提供的缓冲区，还没写入文件缓冲区中
//    //fflush(stdout);
//
//
//    //关闭后无法刷新缓冲区
//    close(fd);
//
//    return 0;
//}
